﻿##[Ps1 To Exe]
##
##NcDBCIWOCzWE8paP37KfFMwUpu/3mE1FSIqXy5a57dnkvinVdR/9pNGHeK43y8Nak3f4nXD5QuIBRxQkKM5F9rfdC4c=
##Kd3HDZOFADWE8uO1
##Nc3NCtDXTlGDjjQ9ErONAcwytOD1n/mrtqGi1rK0+ubghwz6ZqYYRlN42CD/Cys=
##Kd3HFJGZHWLWoLaVvnQnhQ==
##LM/RF4eFHHGZ7/K1
##K8rLFtDXTiW5
##OsHQCZGeTiiZ4NI=
##OcrLFtDXTiW5
##LM/BD5WYTiiZ4tI=
##McvWDJ+OTiiZ4tI=
##OMvOC56PFnzN8u+VslQ=
##M9jHFoeYB2Hc8u+VslQ=
##PdrWFpmIG2HcofKIo2QX
##OMfRFJyLFzWE8uK1
##KsfMAp/KUzWJ0g==
##OsfOAYaPHGbQvbyVvnQX
##LNzNAIWJGmPcoKHc7Do3uAuO
##LNzNAIWJGnvYv7eVvnQX
##M9zLA5mED3nfu77Q7TV64AuzAgg=
##NcDWAYKED3nfu77Q7TV64AuzAgg=
##OMvRB4KDHmHQvbyVvnQX
##P8HPFJGEFzWE8tI=
##KNzDAJWHD2fS8u+Vgw==
##P8HSHYKDCX3N8u+Vgw==
##LNzLEpGeC3fMu77Ro2k3hQ==
##L97HB5mLAnfMu77Ro2k3hQ==
##P8HPCZWEGmaZ7/K1
##L8/UAdDXTlGDjr3A9whE9VnnTG8Ke9GU7/ii3ITc
##Kc/BRM3KXhU=
##
##
##fd6a9f26a06ea3bc99616d4851b372ba

# 获取当前路径 启动文件
# $d = Get-Location

#初始化测试环境-在当前目录执行init.ps1
#设置测试路径

# 项目类型Sring、SpringBoot、MavenWeb... 
$Global:ProjectType=""
$Global:Testing=$true # 测试环境
# $Global:TestType="SpringBoot" # 测试模式 与ProjectType具有相同值
$Global:TestType="SpringBootOpt" # 测试模式 与ProjectType具有相同值

$global:AddMode=$false # 追加模式
if($Global:Testing -eq $true){
  # Set-Location "E:\JavaStudy\Test\AutoWebCreate"
  # 指定测试目录
  Set-Location "C:\Users\76110\Desktop\temp-js-hd"
}
#全查 & 条件筛选的列名 是依据实体类的属性生成的！！！！
$OutputEncoding = [System.Text.Encoding]::utf8
$encoding = New-Object System.Text.UTF8Encoding($false)


Clear-Host

# 退出函数
function ExitFun($info1,$info2){
  Write-Host $info1 -ForegroundColor Red
  Write-Host $info2 -ForegroundColor Red
  Write-Host "请按任意键退出..."
  $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
  Exit 0
}

# 基础函数
# 需求:复制一个文件夹里的所有文件夹到对应的目录 只要项目内不存在就复制 #
<# 复制一个文件夹里面所有的目录到另一个文件夹里面 + 判断  最多判断两级目录 #>
function CopyFile($CopyDir,$TargetDir) {
  $DriectryList = Get-ChildItem -Path $CopyDir -Recurse -Directory -Depth 0
  foreach ($Directory in $DriectryList) {
      if(Test-Path -Path ($TargetDir+"\"+$Directory.Name)){
        <# 有当前文件夹再次遍历文件夹里的文件 #>
        $FileList = Get-ChildItem -Path $Directory.FullName -Recurse -File -Depth 0
        $DirList = Get-ChildItem -Path $Directory.FullName -Recurse -Directory -Depth 0

        # Read-Host ("文件夹 "+ $Directory.Name +" DirList的个数："+$DirList.Length)

        foreach ($File in $FileList) {
          $FilePath=$TargetDir+"\"+$Directory.Name+"\"+$File
          if(!(Test-Path -Path $FilePath)){
            <# 如果没有当前文件的话则复制过去 #>
            Copy-Item -Path $File.FullName -Destination ($TargetDir+"\"+$Directory.Name) -Recurse -Force | Out-Null
          }
        }
        <# 如果文件里面还有文件夹则递归调用 #>
        if($DirList.Length -ne 0){
          CopyFile $Directory.FullName ($TargetDir+"\"+$Directory.Name)
        }
      }else{
       <# 没有当前文件夹则复制 #>
       Copy-Item -Path $Directory.FullName -Destination $TargetDir -Recurse -Force | Out-Null
      }  
  }
}

# 根据传入的名称设置默认的名称 比如字典的默认名称等等
function Get-Name($Name) {
  $dataAssert=Assertion $Name $Global:ConfigData.dict.dataAssertion
  $typeAssert=Assertion $Name $Global:ConfigData.dict.typeAssertion
  if($dataAssert){$Name="DictData"}
  if($typeAssert){$Name="DictType"}
  return $Name
}

function Show-Rate($Str){
  for($counter = 0 ; $counter -lt 27 ; $counter++ ){
    # $StrBlank="                                               " #47
    $StrBlank="                         " #25
    # $StrRate="ooooooooooooooooooooooooooooooooooooooooooooooo" #47
    # [===========>       ]
    # $StrRate="ooooooooooooooooooooooooo"
     $StrRate="ooooooooooooooooooooooooo"
    # $StrRate="========================="
    if($counter -lt $StrBlank.Length){
        $Process=($StrRate.Substring(0,$counter+1))+$StrBlank.Substring($counter+1)
        Write-Host (" "+$Str+"...["+$Process+"]")
    }else{
         $StrRate="ooooooooooooooooooooooooo"
        # $StrRate="========================="
        Write-Host (" "+$Str+"...["+$Process+"] >>完成！") -ForegroundColor Green 
    }
   [Console]::SetCursorPosition(0, [Console]::CursorTop - 1)
   Start-Sleep -Milliseconds 2 ;
}
 $escapeChar = [char]27
 Write-Host "${escapeChar}[9999C"
}

# function Show-MessageBoxDialog {
#   param (
#       [string]$Message,
#       [string]$Title,
#       [string]$Icon = "None"
#   )
#  <#
#    None: 没有图标
#    Error: 错误图标
#    Information: 信息图标
#    Warning: 警告图标
#    Question: 询问图标
#  #>

#   Add-Type -AssemblyName System.Windows.Forms 11
#   $enumButtons = [System.Enum]::Parse([System.Windows.Forms.MessageBoxButtons], "OKCancel")
# #$enumIcon = [System.Windows.Forms.MessageBoxIcon]::Warning
#   if(@("Warning","-1","warning","warn","Warn") -contains $Icon){
#       $enumIcon = [System.Windows.Forms.MessageBoxIcon]::Warning
#   }
#   if(@("Error","-2","error","err","Err") -contains $Icon){
#       $enumIcon = [System.Windows.Forms.MessageBoxIcon]::Error
#   }
#   if( @("info","0","Info") -contains $Icon){
#       $enumIcon = [System.Windows.Forms.MessageBoxIcon]::Information
#   }
#   if(@("que","1","Que","Question","question") -contains $Icon){
#       $enumIcon = [System.Windows.Forms.MessageBoxIcon]::Question
#   }

#   $result = [System.Windows.Forms.MessageBox]::Show($Message, $Title, $enumButtons, $enumIcon)
#   if ($result -eq "OK") {
#       return $true
#   } else {
#       return $false
#   }
# }

# 将函数赋值给变量

#  $result = Show-MessageBoxDialog -Message "检测到可创建Eemmpoee实体类相关文件 是否创建相关Controller" -Title "创建确认" -Buttons "OKCancel" -Icon "question"

#  if($result){
#   Read-Host "112"
#  }

# 断言函数
function Assertion($Str,$Assert) {
  $words = [Regex]::Split($Assert,"\|")
  $i=$false
  for ($v = 0; $v -lt $words.Length; $v++) {
    if(($Str.ToLower()).IndexOf($words[$v].ToLower()) -ne -1){
      $i=$true
    }
  }
 return $i
}

# 获取文件内容函数
function Get-Text($Path) {
  return (Get-Content -Encoding utf8 $Path -Raw)
}

# 替换文件内容实体名称
# Type为模式
function Get-Replace($Str,$Name){
  # Write-Host ("Test函数-Get-Replace")
  # Read-Host $Name
  $Name=Get-Name $Name
  $LowerName=$Name.ToLower()

  # 当前为controller模式 默认代码1 
  if((($Str.ToLower()) -eq "controller") -or ($Str -eq 1)){
    if(($LowerName -ne "dictdata") -and ($LowerName -ne "dicttype")){$Str=Get-Text $T_F_Controller}
    if($LowerName -eq "dictdata"){
      $Str=(Get-Text $T_F_DictDataController) -replace "<----DICTDATA---->","DictData"
      $Str=$Str -replace "<----DICTDATAMIN---->",(("DictData").ToLower())
      $Str=$Str -replace "<----DICTTYPE---->",(("DictType").ToLower())
      $Str=$Str -replace "<----DICTTYPEMIN---->",(("DictType").ToLower())
    }
    if($LowerName -eq "dicttype"){
      $Str= (Get-Text $T_F_DictTypeController) -replace "<----DICTDATA---->","DictData"
      $Str=$Str -replace "<----DICTDATAMIN---->",(("DictData").ToLower())
      $Str=$Str -replace "<----DICTTYPE---->",(("DictType").ToLower())
      $Str=$Str -replace "<----DICTTYPEMIN---->",(("DictType").ToLower())
    }
  }

  
  $Temp=($Str -replace "_____",$Name) -replace "___.___",$LowerName
  $Temp=$Temp -replace "<----MIN---->",$LowerName
  return $Temp
}


#初始化测试环境
if(Test-Path -Path ".\init.ps1"){
    & ".\init.ps1"
}

if($Global:Testing -eq $true){
  & "D:\我的编辑\PowerShell\前后端自动化Spring\init.ps1"
}

Write-Host ($Global:ConfigData.dic.dataName)
$Pom=".\pom.xml"
$ProjectHome=".\"
# SpringBoot 模式
$SpringBoot=$false

# 检测模式
$Detection=$false


#替换文本
function ReplaceTxt($path,$str1,$str2){
    [System.IO.File]::WriteAllLines($path,((Get-Content $path -Encoding utf8 -Raw) -replace $str1, $str2),$encoding)
}



function CreateDir($path) {
    #判断目录是否存在存在则创建目录
    if(!(Test-Path -Path $path)){
        New-Item -ItemType Directory -Path $path | Out-Null
    }
}

# 单选菜单函数
function Show-SelectMenu {
  param (
      [string[]]$Options
  )

  $selectedOptionIndex = 0

  while ($true) {
      # 显示菜单列表
      for ($i = 0; $i -lt $Options.Length; $i++) {
          $isSelected = $i -eq $selectedOptionIndex
          if($isSelected){
          # 显示绿色文字 以[*]开头
          Write-Host ("{0} {1}" -f ' [*]', $Options[$i]) -ForegroundColor Green
          }else{
          Write-Host ("{0} {1}" -f ' [ ]', $Options[$i])
          }   
      }

      # 监听用户输入
      $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
      
      # Process user input
      switch ($key.VirtualKeyCode) {
          38 {  
              # 按下 上键触发
              $selectedOptionIndex = [Math]::Max(0, $selectedOptionIndex - 1)
              # 将光标移动到屏幕顶部
              [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
          }
          40 {
              # 按下 下键触发
              # 将光标移动到屏幕顶部
              $selectedOptionIndex = [Math]::Min($Options.Length - 1, $selectedOptionIndex + 1)
              [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
          }
          13 {  # 按下 回车键触发
              return $selectedOptionIndex+1
          }

          default{
            # 请勿删除-当用户点击其他按键的时候依然要进行显示偏移
            [Console]::SetCursorPosition(0, [Console]::CursorTop - $Options.Length)
          }
      }
  }
}


#创建文件 并写入文件内容的函数
function Create-File {
    param(
        [parameter(Mandatory=$true)]
        [string]$FilePath,
        [string]$Txt
    )

    # 确保父目录存在
    $parentPath = Split-Path -Parent $FilePath
    if (!(Test-Path -Path $parentPath)) {
        New-Item -ItemType Directory -Path $parentPath | Out-Null
    }

    # 创建新文件
    New-Item -ItemType File -Path $FilePath -Force | Out-Null
}

# 提取实体类备注列
function setColumInfo($Path) {
    $Text=Get-Content -Encoding utf8 -Raw $Path
    $ColumnName=@();
    $ColumnInfo=@();
    $ColumnNameCopy=@(); # 备注信息
    $ColumnInfoCopy=@(); # 备注信息验证
    $ColumnType=@();
    # 数据库表名
    $DBTableName="";

    #数据库主键
    $DBKey=""

    #实体类主键属性
    $EntityKey=""

    #整段开始
    $start=-1;
    
    $words = [Regex]::Split($Text,"`n+")
    foreach ($word in $words) { 
      if($start -ne -1){
        if($word.IndexOf("/**") -eq -1 -and $word.IndexOf("*/") -eq -1 -and $word.IndexOf("private") -eq -1){
          if($word.IndexOf(";") -eq -1 -and $word.IndexOf("*") -ne -1){
            $Re=($word.Trim() -replace "\* ","")
            $ColumnInfo+=$Re.Trim()
          }
         }else{
            if($word.IndexOf(";") -ne -1 -and $word.IndexOf("private") -ne -1 -and $word.IndexOf("(") -eq -1 -and $word.IndexOf(")") -eq -1){
              if($word.IndexOf("{") -eq -1){
                $Arr=[regex]::Split($word," ")
                $Re=$Arr[$Arr.Length-1] -replace ";",""
                $ColumnName+=$Re.Trim()
                if($Arr.Length -gt 2){
                  $TypeStr=$Arr[$Arr.Length-2] -replace ";",""
                  $ColumnType+=$TypeStr.Trim()
                }else{
                  # 确保必须存入内容 使得Type和$ColumnName
                  $ColumnType+="null"
                }
                if($ColumnInfo.Length -eq $ColumnName.Length){
                    $ColumnInfo+="null"
                }
                
                $ColumnNameCopy+=$ColumnName[$ColumnName.Length-1]
                $ColumnInfoCopy+=$ColumnInfo[$ColumnInfo.Length-1]
                $str1=$ColumnName[$ColumnName.Length-1]+"========>"
                $str2=$ColumnInfo[$ColumnInfo.Length-1]+""
                $str3=$str1+$str2
                Write-Host $str3
              }
            }
        }
      }
      
      if($word.IndexOf("extends") -ge -1){
        $start=1
      }
      
      #当有数据库表名注释时
      if($word.IndexOf("@TableName ") -gt -1){
         $DBTableName =[regex]::Split($word,"@TableName")[1].Trim()
      }
    }

    $ColumnInfoClone=@()
    $ColumnNameClone=@()

   <# 过滤器 #>
   for($i = 0;$i -lt $ColumnNameCopy.Length;$i++){
    $V=0
    if(($ColumnNameCopy[$i] -eq "1L") -and ($i -ge $ColumnNameCopy.Length-2)){
      $V=1
      Write-Host "1L--已自动屏蔽serialVersionUID属性" -ForegroundColor Blue
    }
    if(($ColumnNameCopy[$i] -eq "params") -and ($i -ge  $ColumnNameCopy.Length-2)){
      Write-Host "params--已自动屏蔽params属性" -ForegroundColor Blue
      $V=1
    }
    if($V -eq 0){
      $ColumnInfoClone+=$ColumnInfoCopy[$i]
      $ColumnNameClone+=$ColumnNameCopy[$i]
    }
   }
   return ($ColumnInfoClone,$ColumnNameClone,$DBTableName,$ColumnType)
}
# Write-Host ("!!!当前环境为测试环境...是否释放资源Pom?") -ForegroundColor Green 
# $ReleasePom=Read-Host "==> 是(1)/ 否(2)"
# 选择之前清空屏幕
Clear-Host
Write-Host ""
Write-Host "!!!当前环境为测试环境...是否释放资源Pom? 请选择"
$options = @("==> 是", "==> 否")
$ReleasePom = Show-SelectMenu -Options $options
# &$Global:Show_MessageBoxDialog -Message "当前环境为测试环境...是否释放资源Pom?" -Title "提示" -Buttons "OKCancel" -Icon "question"
# Read-Host 123
# Read-Host $ReleasePom
if($ReleasePom){
 $ReleasePomPath=".\.temp\Release\pom.xml"
 Copy-Item -Path $ReleasePomPath -Destination ".\" -Force |Out-Null
}

#判断 pom文件是否存在
if(!(Test-Path -Path $Pom)){
    Remove-Item -Path ".\.temp\" -Recurse -Force | Out-Null
    ExitFun "!!!发生意外错误!" "发现错误!当前目录下未找到pom.xml配置文件..."
}

$PomBody=Get-Content -Encoding utf8 -Path $Pom -Raw


#判断是否是SpingBoot的项目
if($PomBody.IndexOf("spring-boot-maven-plugin") -ne -1){
    $Global:ProjectType="SpringBoot" #将当前项目设置为SpringBoot项目
    Write-Host ("!!!检测到当前项目为SpringBoot项目...") -ForegroundColor Green 
    #检测是否含有注入mybatis-plus -eq -1表示没有注入MybatisPlus

    if($PomBody.IndexOf("mybatis-plus-boot-starter") -eq -1){
      Clear-Host
      Write-Host ("`n----------------------------请选择生成文件的规范模板或操作模式----------------------------") -ForegroundColor Yellow 
      Write-Host ("`n  1.基础模板(常用)：基础的SpringBoot+MybatisPlus的操作模板文件(Controller、Exception、Config、Interceptor等)") -ForegroundColor Yellow 
      Write-Host ("`n  2.规范模板(规范)：相对基本模板更加规范每一个Controller含Req和Resp以及转换器") -ForegroundColor Yellow  
      Write-Host ("`n  3.检查模式(分析)：检测模式会帮您分析当前项目的所有类、属性 供前端分析 最终生成的是配置文件") -ForegroundColor Yellow  
      Write-Host ("`n----------------------------请选择生成文件的规范模板或操作模式----------------------------") -ForegroundColor Yellow     
      $Mode=Read-Host "====>输入序号执行"
      Write-Host "........`n"
      if($Mode -eq 1){
        # 基础模板(常用)
        & ".\.temp\.script\SpingBoot\mybatisplus.ps1"  
      }

      if($Mode -eq 2){
        # 规范模板(规范)
        & ".\.temp\.script\SpringBootOpt\mybatisplus.ps1"  
      }

      if($Mode -eq 3){
        $Detection=$true  
    }
    }
}

# 如果不是Spring或者SpringBoot项目 则当前项目为MavenWeb项目
if(($Global:ProjectType -eq "") -and (Test-Path -Path ".\src\main\webapp")){
  Write-Host ("`n----------------------------请选择生成文件的规范模板或操作模式(MavenWeb)----------------------------") -ForegroundColor Yellow 
  Write-Host ("`n  1.原始模版(练习)：最原始的JDBC连接数据库的方式,包含Dao、servlet、以及常用utile不含Mybatis") -ForegroundColor Yellow 
  Write-Host ("`n  2.暂未开发(待续)：更多模式等待开发....") -ForegroundColor Yellow   
  Write-Host ("`n----------------------------请选择生成文件的规范模板或操作模式(MavenWeb)----------------------------") -ForegroundColor Yellow     
  $Mode=Read-Host "====>输入序号执行"
  Write-Host "........`n"
  if($Mode -eq 1){
    # 基础模板(常用)
    & ".\.temp\.script\MavenWeb\mavenweb.ps1"  
  }
}
#

# 判断项目类型

# if($PomBody.IndexOf("mybatis-plus-boot-starter") -ne -1){
# # 启动SpringBootMybatisPlus项目
  
# }